/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package presentacion;

import entities.Categoria;
import entities.Cliente;
import entities.Estadio;
import entities.Fase;
import entities.Partido;
import entities.Precio;
import entities.Silla;
import entities.Sillaxpartido;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.logging.SimpleFormatter;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;
import logicanegocio.CategoriaJpaController;
import logicanegocio.ClienteJpaController;
import logicanegocio.EstadioJpaController;
import logicanegocio.FaseJpaController;
import logicanegocio.PartidoJpaController;
import logicanegocio.PrecioJpaController;
import logicanegocio.SillaJpaController;

/**
 *
 * @author Alejandro
 */
public class Sistema_Mundial {
    private EntityManagerFactory emf= Persistence.createEntityManagerFactory("Sistema_Informacion_Mundial_2014PU");
    /**
     * @param args the command line arguments
     */
    public void main(String[] args){
        
        FaseJpaController controlFase = new FaseJpaController(emf);
        EntityManager em = emf.createEntityManager();
        EntityTransaction transaction = em.getTransaction();
        int com=0;
        try
        {
            transaction.begin();            
            Fase f= em.find(Fase.class, new BigDecimal(2));
            System.out.println(f.getIdFase()+". Fase: "+f.getNombre());
          //  f.setNombre("Octavos");
           // System.out.println(f.getIdFase()+". Fase: "+f.getNombre());
             if(com==1)
             {
                  transaction.commit();
             }
             else
             {
                  transaction.rollback(); 
             }
        }
        catch (Exception ex) {
            if (transaction.isActive())
                transaction.rollback(); 
            Logger.getLogger(Sistema_Mundial.class.getName()).log(Level.SEVERE, null, ex);
        }        
        finally
        {
            em.close();
        }
        
    
        /*Date fechaActual= new Date();
        SimpleDateFormat dateToFecha= new SimpleDateFormat("dd-MM-yy");
        SimpleDateFormat dateToHora= new SimpleDateFormat("hh:mm");
        System.out.println("Disponibilidad de Entredas por partido. Fase "+ "nom_fase");
        System.out.println("Fecha Actual: " + dateToFecha.format(fechaActual));
        System.out.println("Hora Actual: " + dateToHora.format(fechaActual));
         
        List<Fase> findFaseEntities = controlFase.findFaseEntities();
        for (Fase fase : findFaseEntities) {
            if(fase.getIdFase().intValue()==1)
            {
                List<Partido> partidoList = fase.getPartidoList();
                long [] arrSillasDisponibles = new long[partidoList.size()];
                System.out.printf("%-20s%-20s%-20s%-28s%-20s%-20s\n", "Partido", "Fecha","Sede",
                                   "Equipos", "Horario", "Entradas Disponibles" );
                int i=0;
                for (Partido partido : partidoList) {
                    Estadio estadioIdEstadio = partido.getEstadioIdEstadio();
                    List<Categoria> categoriaList = estadioIdEstadio.getCategoriaList();
                    long totalSillasxEstadio =0;
                    for (Categoria categoria : categoriaList) {
                        totalSillasxEstadio+= categoria.getSillaList().size();
                    }
                    long sillasDisponibles= totalSillasxEstadio - partido.getSillaxpartidoList().size();
                    System.out.printf("%-20s%-20s%-20s%-28s%-20s%-20s\n",
                                        partido.getIdPartido().toString(),
                                        dateToFecha.format(partido.getFecha()),
                                        estadioIdEstadio.getLugar(),
                                        partido.getEquipoIdEquipo().getNombre()+ " - "
                                            + partido.getEquipoIdEquipo1().getNombre(),
                                        dateToHora.format(partido.getHora()),
                                        sillasDisponibles
                                        );      
                    arrSillasDisponibles[i]=sillasDisponibles;
                    i++;      
                }
                
                // Se necesita validación cuando es 0 la cantidad de entradas
                //Dato quemado para fines de pruebas. La verdadera condición es cuando
                 // el jugador presione el botón de solicitar entradas, se extrae el id del radiobuttom
                //
                // partidoList.get( radiobu.selectedRow()  )
                // arrSillasDisponibles[ radiobu.selectedRow() ]                               
                if(arrSillasDisponibles[2]>0)
                {
                    solicitarEntradasPartido(partidoList.get(2), arrSillasDisponibles[2] );  
                }                          
            }
        }
        
                
    }

    private static void solicitarEntradasPartido(Partido partido, long entradasDisp) {
        System.out.println("\nDisponibilidad de entradas por categoria"); 
        System.out.println("Estadio\t"+partido.getEstadioIdEstadio().getLugar());
        System.out.println("Partido\t"+ partido.getIdPartido().toString());
        System.out.println("Entradas Disponibles: "+ entradasDisp);
        List<Categoria> categoriaList = partido.getEstadioIdEstadio().getCategoriaList();
        System.out.printf("%-12s%-15s%20s\n", "Categoria","Precio","Entradas Disponibles");
        long totalSillasCompradas[]= new long[categoriaList.size()];
        List<Sillaxpartido> sillaxpartidoList = partido.getSillaxpartidoList();
        for (int i = 0; i < categoriaList.size(); i++) {
            totalSillasCompradas[i]=0;
            for (int j = 0; j < sillaxpartidoList.size(); j++) {
                if(sillaxpartidoList.get(j).getSillaxpartidoPK().getSillaCatIdCategoria()== 
                       categoriaList.get(i).getCategoriaPK().getIdCategoria() )
                {
                    totalSillasCompradas[i]++;
                }
            }
        }
        
        PrecioJpaController controlPrecio = new PrecioJpaController(emf);
        List<Precio> findPrecioEntities = controlPrecio.findPrecioEntities();
        long listaValorPrecio []= new long[categoriaList.size()];
        int auxIdPartido= partido.getIdPartido().intValue();
        for (int i = 0; i < categoriaList.size(); i++) {
            listaValorPrecio[i]=0;
            for (int j = 0; j < findPrecioEntities.size(); j++) {
                if( auxIdPartido == findPrecioEntities.get(j).getPartidoIdPartido().getIdPartido().intValue()
                        && categoriaList.get(i).getCategoriaPK().getIdCategoria().intValue() == 
                            findPrecioEntities.get(j).getCategoria().getCategoriaPK().getIdCategoria().intValue())
                {
                    listaValorPrecio[i]= findPrecioEntities.get(j).getValor().longValue();
                    break;
                }
            }
        }
        
        int i=0;
        long sillasDispxCat=0;
        for (Categoria categoria : categoriaList) {
            sillasDispxCat= categoria.getSillaList().size() - totalSillasCompradas[i];     
            System.out.printf("%-12s%-15s%20s\n", categoria.getCategoriaPK().getIdCategoria(),
                    listaValorPrecio[i], sillasDispxCat);  
            i++;
        }
        
        //Aca el usuario escoge que opcion quiere, en qué categoria va a comprar
        
        //Se debe pasar al otro método:
        //El partido, la categoría del partido o almenos el id de categoría, los cupos disponibles de esa categoria
   */
    }

    
    public List<Fase> getListFases()
    {
        FaseJpaController controlFase = new FaseJpaController(emf);
        List<Fase> findFaseEntities = controlFase.findFaseEntities();
        return findFaseEntities;               
    }

    public List<Partido> getListPartidosMayorFecha(Date fechaActual, Fase fase) {
        PartidoJpaController contro= new PartidoJpaController(emf);
        System.out.println("***********************************************************************");
        System.out.println("************ENTRE A BUSCAR PARTIDOS MAYORES A LA FECHA*****************");
        System.out.println("***********************************************************************");
        List<Partido> listPartido = contro.findPartidosMayorAFecha(fechaActual, fase.getIdFase().toString());         
        return listPartido;
    }

    BigDecimal getEntradasDispPartido(Partido part) {
        PartidoJpaController contro= new PartidoJpaController(emf);
        return contro.getEntradasDispPartido(part.getIdPartido(), part.getEstadioIdEstadio().getIdEstadio());
    }

    List<Categoria> getListCategoriasPorPartido(Partido partido) {        
        return partido.getEstadioIdEstadio().getCategoriaList();
    }

    Precio getPrecioCatXPartido(Categoria cat, Partido part) {
        CategoriaJpaController contro = new CategoriaJpaController(emf);
        return contro.getPrecioCatXPartido(cat.getCategoriaPK().getEstadioIdEstadio(),
                                            cat.getCategoriaPK().getIdCategoria(),
                                            part.getIdPartido());
    }

    BigDecimal getEntradasDispCategoriaXPartido(Categoria cat, Partido part) {
        CategoriaJpaController contro = new CategoriaJpaController(emf);
        return contro.getEntradasDispCategoriaXPartido(cat.getCategoriaPK().getEstadioIdEstadio(),
                                            cat.getCategoriaPK().getIdCategoria(),
                                            part.getIdPartido());
    }

    List<Silla> getListSillasCategoriaEstadio(Partido partido, String cat) {
        EstadioJpaController contro= new EstadioJpaController(emf);
        return contro.getSillasXCategoriaXEstadio(partido.getEstadioIdEstadio().getIdEstadio(), cat);
    }

    List<Sillaxpartido> getListSillasOcupadasXPartido(Partido partido, String cat) {
        PartidoJpaController contro= new PartidoJpaController(emf);
        return contro.getSillasOcupadasXPartido(partido.getIdPartido(), cat);
    }

   
    
}

